Avis Restau - Etude de faisabilité nouvelles fonctionnalités de collaboration
¶

0. Plan du notebook
¶

  1. Analyse des commentaires négatifs

    1.1 LDA
    1.2 TF-IDF et NMF
    1.3 Word embedding

  2. Classification des images

    2.1 Extraction
    2.2 SIFT
    2.3 Transfer Learning : VGG16
    2.4 Transfer Learning : ResNet50

  3. Test de l'API
  4. Conclusion

Distribution des notes de satisfaction des restaurants¶

1. Analyse des commentaires négatifs
¶

1 étoile
---------
Chaque utilisateur a rédigé en moyenne 1.4 reviews
Chaque établissement a reçu en moyenne 12.3 reviews

Langues détectées :
-----------------
en	 :: 10000 occurrences

1.1 LDA
¶

LDA : Unigrammes¶

Détermination du score de cohérence pour un nombre déterminé de sujets, entre 2 et 30

<AxesSubplot:xlabel='nb_topics', ylabel='coherence_score'>
Sur cette courbe, à l'instar de la méthode du coude, nous recherchons le point d'inflexion de la courbe.
Ici, ce point semble être atteint pour $K = 21$.

Liste des mots les plus fréquents pour un regroupement LDA en 21 sujets :

(20, '0.031*"bar" + 0.014*"bartender" + 0.013*"friend" + 0.012*"like" + 0.011*"drink"')
(6, '0.017*"said" + 0.014*"back" + 0.014*"told" + 0.014*"would" + 0.013*"manager"')
(7, '0.017*"steak" + 0.015*"ordered" + 0.013*"meal" + 0.011*"restaurant" + 0.011*"meat"')
(13, '0.022*"restaurant" + 0.016*"menu" + 0.015*"price" + 0.015*"reservation" + 0.013*"would"')
(16, '0.017*"like" + 0.009*"one" + 0.009*"people" + 0.008*"get" + 0.007*"want"')
(8, '0.084*"room" + 0.042*"hotel" + 0.022*"car" + 0.017*"stay" + 0.017*"casino"')
(19, '0.060*"order" + 0.060*"pizza" + 0.017*"ordered" + 0.017*"time" + 0.013*"delivery"')
(18, '0.031*"cheese" + 0.029*"salad" + 0.018*"bread" + 0.017*"sauce" + 0.013*"like"')
(14, '0.015*"rice" + 0.014*"sushi" + 0.014*"chicken" + 0.014*"fish" + 0.013*"roll"')
(9, '0.014*"chicken" + 0.013*"like" + 0.012*"sandwich" + 0.012*"fry" + 0.012*"order"')
(0, '0.075*"taco" + 0.040*"mexican" + 0.036*"chip" + 0.027*"salsa" + 0.027*"donut"')
(2, '0.015*"like" + 0.014*"better" + 0.013*"good" + 0.010*"taste" + 0.009*"price"')
(12, '0.040*"husband" + 0.028*"vegan" + 0.020*"hair" + 0.010*"law" + 0.009*"hookah"')
(3, '0.035*"owner" + 0.030*"service" + 0.030*"customer" + 0.030*"review" + 0.029*"restaurant"')
(17, '0.015*"dirty" + 0.012*"health" + 0.011*"clean" + 0.011*"one" + 0.009*"hand"')
(10, '0.018*"drink" + 0.017*"table" + 0.013*"server" + 0.010*"one" + 0.010*"asked"')
(1, '0.054*"cake" + 0.021*"mother" + 0.015*"mom" + 0.014*"birthday" + 0.013*"child"')
(15, '0.039*"ramen" + 0.031*"bug" + 0.030*"pork" + 0.029*"roach" + 0.028*"com"')
(11, '0.020*"coffee" + 0.019*"time" + 0.017*"like" + 0.016*"get" + 0.010*"really"')
(4, '0.232*"burger" + 0.066*"dog" + 0.030*"store" + 0.027*"bun" + 0.026*"fry"')

Représentation graphique des bigrammes pour $K=21$

C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\pyLDAvis\_prepare.py:247: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.
  by='saliency', ascending=False).head(R).drop('saliency', 1)

LDA : Bigrammes¶

Liste des mots les plus fréquents pour un regroupement LDA en 21 sujets :

(6, '0.023*"owner" + 0.012*"customer" + 0.011*"restaurant" + 0.010*"business" + 0.009*"people"')
(15, '0.052*"steak" + 0.018*"pasta" + 0.012*"meal" + 0.011*"bread" + 0.007*"well_done"')
(8, '0.046*"table" + 0.021*"restaurant" + 0.014*"minute" + 0.014*"food" + 0.014*"server"')
(16, '0.030*"groupon" + 0.013*"cupcake" + 0.012*"fianc" + 0.008*"told" + 0.008*"voucher"')
(14, '0.055*"order" + 0.017*"food" + 0.016*"time" + 0.015*"get" + 0.014*"place"')
(1, '0.049*"shrimp" + 0.037*"salad" + 0.028*"crab" + 0.018*"seafood" + 0.016*"ramen"')
(12, '0.013*"would" + 0.011*"manager" + 0.009*"said" + 0.008*"told" + 0.008*"back"')
(17, '0.033*"room" + 0.019*"hotel" + 0.012*"one" + 0.011*"night" + 0.010*"stay"')
(13, '0.051*"bar" + 0.043*"drink" + 0.021*"bartender" + 0.019*"beer" + 0.019*"friend"')
(10, '0.013*"place" + 0.009*"like" + 0.008*"restaurant" + 0.008*"one" + 0.006*"also"')
(5, '0.018*"food" + 0.012*"place" + 0.011*"one" + 0.009*"good" + 0.009*"like"')
(20, '0.026*"food" + 0.022*"chicken" + 0.017*"place" + 0.014*"dish" + 0.013*"sauce"')
(2, '0.165*"pizza" + 0.013*"slice" + 0.012*"cheese" + 0.011*"pie" + 0.010*"crust"')
(19, '0.075*"cake" + 0.022*"bagel" + 0.022*"donut" + 0.019*"bakery" + 0.013*"mask"')
(18, '0.016*"place" + 0.012*"food" + 0.011*"like" + 0.009*"good" + 0.008*"one"')
(3, '0.014*"food" + 0.012*"one" + 0.009*"order" + 0.008*"time" + 0.008*"place"')
(4, '0.091*"buffet" + 0.013*"dirty" + 0.012*"store" + 0.010*"mom" + 0.008*"went_counter"')
(7, '0.017*"coupon" + 0.010*"club" + 0.009*"cat" + 0.008*"racist" + 0.008*"place"')
(0, '0.018*"dog" + 0.010*"card" + 0.009*"service_dog" + 0.008*"receipt" + 0.006*"food_cold"')
(9, '0.047*"taco" + 0.019*"burrito" + 0.011*"tortilla" + 0.011*"crawfish" + 0.009*"oyster"')

Représentation graphique des bigrammes pour $K=21$

C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\pyLDAvis\_prepare.py:247: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.
  by='saliency', ascending=False).head(R).drop('saliency', 1)

(Retour sommaire)

1.2 TF-IDF & NMF

Termes les plus fréquents pour les unigrammes avec $K=21$¶

Topic 0:
said | manager | asked | told | back | never | came | would | went | could
Topic 1:
salad | ordered | sauce | steak | dish | shrimp | meal | soup | like | menu
Topic 2:
pizza | crust | slice | topping | cheese | delivery | pepperoni | pie | oven | sauce
Topic 3:
table | minute | waitress | wait | seated | waited | hostess | waiting | came | sat
Topic 4:
bar | drink | bartender | beer | friend | night | glass | bouncer | one | group
Topic 5:
order | minute | delivery | time | hour | phone | called | call | ordered | get
Topic 6:
food | good | cold | mexican | eat | quality | price | got | buffet | hour
Topic 7:
reservation | party | made | group | told | would | hostess | hour | dinner | groupon
Topic 8:
burger | fry | medium | bun | cheese | patty | shake | ordered | beer | onion
Topic 9:
cake | wedding | bakery | birthday | cupcake | day | crab | would | chocolate | icing
Topic 10:
coffee | breakfast | egg | cup | shop | toast | counter | morning | barista | starbucks
Topic 11:
sushi | roll | fish | chef | rice | eat | japanese | nigiri | tuna | piece
Topic 12:
room | hotel | stay | desk | bed | casino | night | front | floor | day
Topic 13:
restaurant | review | experience | star | yelp | would | one | menu | dining | could
Topic 14:
service | customer | rude | horrible | terrible | never | worst | bad | staff | ever
Topic 15:
sandwich | cheese | bread | fry | meat | lunch | cheesesteak | cuban | philly | onion
Topic 16:
chicken | fried | wing | rice | sauce | piece | raw | taco | flavor | tasted
Topic 17:
place | like | time | get | people | really | even | good | one | say
Topic 18:
card | credit | tip | bill | charge | cash | charged | pay | receipt | check
Topic 19:
owner | business | customer | employee | mask | rude | establishment | support | treat | review
Topic 20:
server | drink | came | check | water | took | asked | come | brought | never

Termes les plus fréquents pour les bigrammes avec $K=21$¶

Topic 0:
came back | drink order | another minute | waited minute | took minute | take order | waited waited | minute get | never came | dining experience
Topic 1:
customer service | poor customer | worst customer | terrible customer | horrible customer | service never | service skill | service ever | bad customer | good customer
Topic 2:
first time | last time | even though | last night | year old | look like | behind counter | looked like | food good | somewhere else
Topic 3:
could give | zero star | star would | give zero | give star | wish could | negative star | would give | give place | star could
Topic 4:
credit card | card company | card number | gift card | day later | card machine | gave credit | next day | card charge | left cash
Topic 5:
come back | never come | food cold | bed bug | ever come | back place | would come | dim sum | back say | told come
Topic 6:
happy hour | hour menu | hour special | hour price | said happy | sit bar | hour bar | come happy | behind bar | went friday
Topic 7:
tasted like | taste like | fried rice | indian food | like came | looked like | mashed potato | sauce tasted | chicken tasted | like sitting
Topic 8:
bad service | bad food | food bad | service horrible | service bad | better option | management completely | horrible management | food service | back bad
Topic 9:
new orleans | red bean | restaurant new | bean rice | place new | service new | ever new | thought tourist | orleans would | kitchen nightmare
Topic 10:
one star | star review | give one | gave one | star rating | place one | star food | five star | get one | giving one
Topic 11:
food poisoning | got food | get food | two word | word food | hour later | case one | poisoning eat | star case | got sick
Topic 12:
would never | never back | recommend place | place anyone | never recommend | would recommend | unprofessional would | horrible service | food subpar | place would
Topic 13:
gluten free | free pizza | free item | free option | money back | free menu | ordered gluten | behind counter | celiac disease | free bread
Topic 14:
going back | never going | definitely going | ever going | needle say | put bar | beer expensive | say going | eat dinner | back anytime
Topic 15:
wearing mask | wear mask | without mask | one wearing | health department | employee wearing | staff wearing | social distancing | mask optional | client base
Topic 16:
waste time | time money | much better | save time | money place | complete waste | better waste | meat food | non smoking | service better
Topic 17:
service dog | service animal | veteran service | american disability | disability act | federal law | veteran day | mediterranean cuisine | dog restaurant | pizza place
Topic 18:
minute later | five minute | came back | back minute | another minute | order minute | ten minute | later still | later came | hour later
Topic 19:
mexican food | mexican restaurant | taco bell | real mexican | authentic mexican | chip salsa | food ever | worst mexican | good mexican | food eat
Topic 20:
mac cheese | fried chicken | green bean | soul food | taste like | potato salad | chicken wing | pulled pork | collard green | sweetie pie
LDA et NMF : conclusion sur la recherche de sujets d'insatisfaction

Nous pouvons observer plusieurs choses :
  • Les représentation sont complémentaires : chacune des 4 représentations ci-dessus (LDA-unigrammes, LDA-bigrammes, NMF-unigrammes, NMF-bigrammes) apporte un éclairage différent sur les données et aucune ne peut se prévaloir de couvrir l'intégralité des sujets disponibles avec la division que nous avons choisi (21 sujets), bien que les représentations LDA semblent capturer les sujets avec moins de redondance et plus de précision.
  • La segmentation en un nombre faible de sujets appauvrit considérablement l'analyse : la sémantique est mélangée et il est alors difficile voire impossible d'attribuer un titre à chaque sujet. Au contraire, à partir de 16 sujets (et mieux encore pour 21) on constate une bonne séparation sémantique et une meilleure capacité d'analyse.
  • Les sujets ne sont pas de même importance informationnelle : ont trouve en effet une répartition par type de cuisine (japonaise, mexicaine, burgers, pâtisseries, etc.) qui ne nous intéresse pas, à côté de réels sujets transverses d'insatisfaction qui ont beaucoup plus d'intérêt.
  • Les sujets transverses d'insatisfaction trouvés via notre analyse sont les suivants :
    • Rapport qualité/prix
    • Qualité (en particulier le goût et l'aspect)
    • Prix (notamment l'application des réductions)
    • Service client
    • Temps d'attente
    • Professionalisme (en particulier l'attitude des serveurs)
    • Management (chefs de salle et propriétaires)
    • Propreté
    • Infestation (cafards, rats, etc.)
    • Accessibilité (normes handicapés)
    • Lieu et expérience (décoration, ambiance, etc.)
    • Livraison
    • Racisme

(Retour sommaire)

1.3 Word embedding
¶

Nous allons en supplément utiliser une technique de word embedding afin de découvrir les termes présentant la plus grande similarité avec les motifs d'insatisfaction que nous avons trouvé.
Word most similar to : wait
['waiting', 'waited', 'sit', 'took', 'ready', 'later', 'closing', 'take', 'seated', 'timed']
Word most similar to : poisoning
['diarrhea', 'symptom', 'sick', 'ache', 'stomach', 'coli', 'tainted', 'ill', 'shipment', 'salmonella']
Word most similar to : service
['experience', 'attitude', 'food', 'treatment', 'inattentive', 'consistently', 'ambiance', 'overall', 'exceptionally', 'atmosphere']
Word most similar to : food
['meal', 'sushi', 'everything', 'service', 'pizza', 'entree', 'drink', 'apps', 'dish', 'actually']
Word most similar to : drink
['beer', 'cocktail', 'water', 'refill', 'beverage', 'round', 'soda', 'bartender', 'mimosa', 'appetizer']
Word most similar to : restaurant
['place', 'establishment', 'eatery', 'location', 'joint', 'considering', 'resturant', 'dining', 'people', 'venue']
Word most similar to : taste
['flavor', 'tasted', 'aftertaste', 'texture', 'consistency', 'marinade', 'tasteless', 'bland', 'overpowering', 'flavorless']
Word most similar to : accessibility
['braille', 'ramp', 'handicapped', 'accessible', 'height', 'congested', 'leading', 'wooden', 'lighting', 'loo']
Word most similar to : dirty
['sticky', 'grimy', 'wipe', 'clean', 'wiped', 'filthy', 'silverware', 'cloth', 'mop', 'dingy']
Word most similar to : racism
['prejudice', 'discrimination', 'discriminating', 'undertone', 'bigoted', 'negativity', 'condone', 'cruelty', 'irresponsible', 'wikipedia']
Word most similar to : waiter
['waitress', 'server', 'hostess', 'table', 'bartender', 'manager', 'waitstaff', 'maitre', 'sever', 'host']
Word most similar to : waitress
['waiter', 'server', 'bartender', 'lady', 'manager', 'table', 'hostess', 'girl', 'finally', 'waitstaff']
Word most similar to : bartender
['server', 'waitress', 'drink', 'waiter', 'bar', 'female', 'guy', 'girl', 'tab', 'bouncer']
Word most similar to : price
['pricing', 'priced', 'quality', 'cost', 'expectation', 'expensive', 'amount', 'dollar', 'portion', 'carte']
Word most similar to : quality
['average', 'priced', 'subpar', 'mediocre', 'turnover', 'price', 'substandard', 'execution', 'superb', 'inconsistent']
Word most similar to : review
['rating', 'reviewer', 'yelpers', 'yelp', 'post', 'yelper', 'feedback', 'bash', 'experience', 'update']
Word most similar to : star
['rating', 'negative', 'rate', 'scathing', 'zagat', 'stellar', 'coveted', 'bash', 'merit', 'chance']
Word most similar to : like
['stupid', 'embarassed', 'strange', 'think', 'kind', 'blankly', 'badly', 'funny', 'crap', 'shit']
Word most similar to : order
['minute', 'min', 'ordering', 'ordered', 'check', 'forever', 'told', 'payment', 'pick', 'ask']
Word most similar to : table
['seat', 'booth', 'seated', 'sat', 'party', 'server', 'waitress', 'hostess', 'plate', 'waiter']
Word most similar to : bar
['upstairs', 'bartender', 'patio', 'table', 'downstairs', 'booth', 'lounge', 'bench', 'outside', 'watched']
Word most similar to : owner
['manager', 'manger', 'management', 'supervisor', 'employee', 'swearing', 'kevin', 'pamela', 'verbatim', 'behalf']
Word most similar to : minute
['min', 'hour', 'patiently', 'order', 'minuet', 'moment', 'ten', 'forever', 'finally', 'eternity']
Word most similar to : customer
['patron', 'costumer', 'employee', 'business', 'client', 'job', 'management', 'people', 'respect', 'profession']
Word most similar to : reservation
['appointment', 'arrangement', 'party', 'booking', 'seated', 'reserved', 'advance', 'hostess', 'beforehand', 'opentable']
Word most similar to : experience
['service', 'visit', 'review', 'treatment', 'impression', 'gamlin', 'incident', 'evening', 'experienced', 'encounter']
Word embedding

En utilisant le word embedding sur les mots représentant le plus nos sujets, nous sommes en mesure d'en visualiser le contexte et d'apprécier encore mieux le sens que les auteurs des avis avaient en tête en les utilisant.
Ceci complète l'analyse précédente adroitement. En effet, si nous souhaitons par exemple savoir ce qui a le plus dérangé les clients s'étant plaints de l'accessibilté, nous avons ici des éléments de réponse :
  • l'absence de braille
  • l'absence de rampe d'accès
  • l'insuffisance de lumière
  • l'étroitesse des circulations
  • le manque d'accompagnement
  • le manque d'équipements pour personnes handicapées
  • la difficulté d'accès aux sanitaires
  • la configuration du lieu (en particulier la hauteur)
  • etc.

(Retour sommaire)

2. Classification des images
¶

2.1 Extraction
¶

Extraction des 200 premières photos pour chacune des 5 catégories (1000 photos)¶

Catégories :
----------
1 : inside
2 : outside
3 : drink
4 : food
5 : menu

Représentation des images après *preprocessing*¶

<matplotlib.image.AxesImage at 0x1d8033b3ee0>
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
<matplotlib.image.AxesImage at 0x1d80341ca00>

(Retour sommaire)

2.2 SIFT
¶

Affichage de quelques images par catégorie¶

inside
-------
outside
-------
menu
-------
food
-------
drink
-------

Segmentation¶

Score ARI après t-SNE : 0.1175142007713266

Précisions sur la segmentation¶

Répartition des photos dans chacune des 5 classes trouvées par le K-Means :

<AxesSubplot:>

Matrice de confusion :

array([[ 61,  69,  27,  28,  15],
       [ 32,  96,  42,  22,   8],
       [ 49,  20,  84,  39,   8],
       [ 13,   9,  21,  45, 112],
       [ 63,  19,  81,  21,  16]], dtype=int64)

Rapport de classification :

              precision    recall  f1-score   support

           0       0.28      0.30      0.29       200
           1       0.45      0.48      0.46       200
           2       0.33      0.42      0.37       200
           3       0.29      0.23      0.25       200
           4       0.10      0.08      0.09       200

    accuracy                           0.30      1000
   macro avg       0.29      0.30      0.29      1000
weighted avg       0.29      0.30      0.29      1000

SIFT : conclusion

Les résultats de SIFT ne sont pas très probants dans le cas qui nous intéresse :
  • Le nombre de photo trouvée par catégorie est très variable : de 150 à 200 photos
  • Le classement opéré sur les photos n'a rien à voir avec les étiquettes réelles, autrement dit les descripteurs trouvés ne sont pas ceux qui nous intéressent
Le second point est illustré par le score ARI très bas trouvé à l'issue du K-Means en sortie d'ACP (0.16), nombre qui diminue encore après application de t-SNE (0.12).
Nous allons comaprer ces résultats avec des méthodes faisant appel aux réseaux de neuronne convolutifs.

(Retour sommaire)

2.3 Transfer Learning : VGG16
¶

Model: "vgg16"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_6 (InputLayer)        [(None, 224, 224, 3)]     0         
                                                                 
 block1_conv1 (Conv2D)       (None, 224, 224, 64)      1792      
                                                                 
 block1_conv2 (Conv2D)       (None, 224, 224, 64)      36928     
                                                                 
 block1_pool (MaxPooling2D)  (None, 112, 112, 64)      0         
                                                                 
 block2_conv1 (Conv2D)       (None, 112, 112, 128)     73856     
                                                                 
 block2_conv2 (Conv2D)       (None, 112, 112, 128)     147584    
                                                                 
 block2_pool (MaxPooling2D)  (None, 56, 56, 128)       0         
                                                                 
 block3_conv1 (Conv2D)       (None, 56, 56, 256)       295168    
                                                                 
 block3_conv2 (Conv2D)       (None, 56, 56, 256)       590080    
                                                                 
 block3_conv3 (Conv2D)       (None, 56, 56, 256)       590080    
                                                                 
 block3_pool (MaxPooling2D)  (None, 28, 28, 256)       0         
                                                                 
 block4_conv1 (Conv2D)       (None, 28, 28, 512)       1180160   
                                                                 
 block4_conv2 (Conv2D)       (None, 28, 28, 512)       2359808   
                                                                 
 block4_conv3 (Conv2D)       (None, 28, 28, 512)       2359808   
                                                                 
 block4_pool (MaxPooling2D)  (None, 14, 14, 512)       0         
                                                                 
 block5_conv1 (Conv2D)       (None, 14, 14, 512)       2359808   
                                                                 
 block5_conv2 (Conv2D)       (None, 14, 14, 512)       2359808   
                                                                 
 block5_conv3 (Conv2D)       (None, 14, 14, 512)       2359808   
                                                                 
 block5_pool (MaxPooling2D)  (None, 7, 7, 512)         0         
                                                                 
 global_max_pooling2d_2 (Glo  (None, 512)              0         
 balMaxPooling2D)                                                
                                                                 
=================================================================
Total params: 14,714,688
Trainable params: 0
Non-trainable params: 14,714,688
_________________________________________________________________

K-Means sur les prédictions centrées-réduites¶

C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\sklearn\cluster\_kmeans.py:1332: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=4.
  warnings.warn(
Score ARI brut : 0.4598008242990195

ACP et second K-Means¶

Score ARI après ACP : 0.471538173585247
C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\sklearn\cluster\_kmeans.py:1332: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=4.
  warnings.warn(

t-SNE et troisième K-Means¶

Score ARI après t-SNE : 0.533229525218234

Précisions de la segmentation¶

Répartition des photos dans chacune des 5 classes trouvées par le K-Means :

<AxesSubplot:>

Matrice de confusion :

Correspondance des clusters :  [4, 3, 1, 2, 0]
[[149  18   1  29   3]
 [  5 178   4   9   4]
 [  3   2 156  31   8]
 [ 85  11   6  97   1]
 [  0   3  18   9 170]]

Rapport de classification :

              precision    recall  f1-score   support

           0       0.62      0.74      0.67       200
           1       0.84      0.89      0.86       200
           2       0.84      0.78      0.81       200
           3       0.55      0.48      0.52       200
           4       0.91      0.85      0.88       200

    accuracy                           0.75      1000
   macro avg       0.75      0.75      0.75      1000
weighted avg       0.75      0.75      0.75      1000

Erreurs de classification : `menu` classés en `drink` (85 photos en tout)¶

Erreurs de classification : `inside` classés en `menu` (31 photos en tout)¶

Erreurs de classification : `drink` classés en `menu` (29 photos en tout)¶

VGG16 : conclusion

On constate ici que les réseaux convolutifs donnent de bien meilleures performances sur notre jeu d'images (ARI 0.53, Accuracy 0.75) que la méthode SIFT (ARI 0.16, Accuracy 0.30).
Les photos les mieux classées appartiennent aux catégories `food` et `outside`.
La catégorie la moins bien identifiée par VGG16 est `menu` dont les images ont été classifiée en `drink` pour presque la moitié d'entre elles. En affichant les images sur lesquelles il y a eu erreur de classification, à part celles sur lesquelles apparaissent des bouteilles et des parties de verres, il est cependant difficile de comprendre quels descripteurs ont conduit à cette classification.
Ceci étant, les très bonnes performances montrées par la pipeline CNN -> ACP -> t-SNE -> K-Means indiquent qu'avec l'entraînement adéquat il sera possible d'étiqueter automatiquement les images avec une grande précision.

(Retour sommaire)

2.4 Transfert Learning : ResNet50
¶

Premier K-Means sur les prédictions centrées-réduites¶

C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\sklearn\cluster\_kmeans.py:1332: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=4.
  warnings.warn(
Score ARI brut : 0.536333646979273

ACP et second K-Means¶

Score ARI après ACP : 0.5434840625386322
C:\Users\aledo\anaconda3\envs\p6\lib\site-packages\sklearn\cluster\_kmeans.py:1332: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=4.
  warnings.warn(

t-SNE et troisième K-Means¶

Score ARI après t-SNE : 0.589022343063851

Précisions sur la segmentation¶

Répartition des photos dans chacune des 5 classes trouvées par le K-Means :

<AxesSubplot:>

Matrice de confusion :

Correspondance des clusters :  [0, 2, 4, 3, 1]
[[146   7   5  42   0]
 [  3 186   4   4   3]
 [  2   2 173  20   3]
 [ 85  10   7  95   3]
 [  0   3  12  10 175]]

Rapport de classification :

              precision    recall  f1-score   support

           0       0.62      0.73      0.67       200
           1       0.89      0.93      0.91       200
           2       0.86      0.86      0.86       200
           3       0.56      0.47      0.51       200
           4       0.95      0.88      0.91       200

    accuracy                           0.78      1000
   macro avg       0.78      0.78      0.77      1000
weighted avg       0.78      0.78      0.77      1000

On obtient avec ResNet des performances comparables à VGG16, voire même légèrement supérieures :
Métrique VGG16 ResNet50
ARI brute 0.46 0.53
ARI après ACP 0.47 0.54
ARI après t-SNE 0.53 0.59
Acuracy 0.75 0.78

(Retour sommaire)

3. Test de l'API
¶

Récupération de 593 nouveaux avis à propos de 200 restaurants.
Requête effectuée en 14.4 secondes.
business_id stars text
0 Vaq49W0ubGjuIc4h5_qQ0w 5 This place was absolutely delicious! It was a ...
1 Vaq49W0ubGjuIc4h5_qQ0w 4 The food here is spot on. Portions were very w...
2 Vaq49W0ubGjuIc4h5_qQ0w 4 This place is very popular for their beautiful...
3 oK_SLmmAVQg3meguh7LrIA 5 Fantastic chicken, beef, and mango lasses. Col...
4 oK_SLmmAVQg3meguh7LrIA 5 Just wow. Can't go wrong here. I'm Indian I wo...
API Yelp : conclusion

On constate ici que les résultats renvoyés sont exactement les mêmes en utilisant l'une ou l'autre des API de Yelp, cependant l'API GraphQL est beaucoup plus performante.
En effet, l'API GraphQL permet :
  • Un temps de traitement 6 fois plus rapide de la requête que nous avons testée
  • Le renvoi des seules informations demandées en une seule requête simple, donc des temps de développement beaucoup plus courts et une charge réseaux moindre
Concernant les résultats de l'appel API eux-mêmes :
  • On s'aperçoit que seuls 3 avis par établissement sont disponibles (les 3 plus récents), ce qui implique soit d'augmenter le nombre d'établissements consultés, soit d'interroger à fréquence choisie l'API afin de recueillir les avis les plus fréquents à mesure qu'ils sont postés (avec recherche de doublons pour éliminer les éventuels avis déjà collecté)
  • La réparition par nombre d'étoiles sur les avis collectés sont pauvres en avis négatifs, ce qui impliquera de collecter les avis de plus d'établissement et/ou d'étendre notre études aux avis ayant reçu 2 étoiles afin de disposer de suffisamment de données

(Retour sommaire)

4. Conclusion
¶

Notre étude de faisabilité est un succès

Détection des sujets d'insatisfaction
Nous avons montré qu'avec les méthodes LDA et NMF, voire une combinaison des deux approches, il est possible de trouver les sujets d'insatisfaction principaux des usagers de Yelp. Afin d'être complète, notre pipeline pourra inclure les éléments suivants :
  • Augmentation du volume du corpus de documents afin d'accroître la représentativité des sujets traités
  • Détection automatique des sujets non-transverses, c'est-à-dire ceux liés uniquement à des types de cuisine

Etiquetage automatique des photos
Nous avons vu qu'avec un nombre très faible d'images en entrées et sans entraînement de classifieur spécifique, les réseaux convolutifs étaient déjà en mesure de retrouver les catégories désirées avec une précision intéressante en transfer learning. Afin d'être complète, notre approche de développement doit impliquer un fine tuning d'un modèle de réseau convolutif (VGG16 ou ResNet50 par exemple) sur une base d'image labellisée de volume conséquent.

Test de l'API
Nous avons constaté que l'API Yelp, en particulier la nouvelle interface GraphQL, permettait de récupérer avec une grande facilité de nouvelles données susceptibles d'alimenter nos modèles.

(Retour sommaire)